package com.devotion.velocity.framework;

import com.devotion.velocity.annotation.Component;
import com.devotion.velocity.util.ClassFilter;
import com.devotion.velocity.util.ClassScanner;
import com.devotion.velocity.util.InstanceUtil;

import java.lang.reflect.Modifier;
import java.util.Map;

public class ApplicationContext implements Context {

    protected static Map<String, Class> classMap;
    protected static Map<String, Object> instanceMap;
    protected static ClassFilter filter = (Class clazz) -> {
        int modifiers = clazz.getModifiers();
        return !Modifier.isAbstract(modifiers)
                && !Modifier.isInterface(modifiers)
                && Modifier.isPublic(modifiers)
                && !Modifier.isStatic(modifiers);
    };
    //    protected static ClassFilter filter = new ClassFilter() {
//        public boolean accept(Class clazz) {
//            return !Modifier.isAbstract(clazz.getModifiers())
//                    && !Modifier.isInterface(clazz.getModifiers())
//                    && Modifier.isPublic(clazz.getModifiers())
//                    && !Modifier.isStatic(clazz.getModifiers());
//        }
//    };
    protected static String[] defaultPackages = {"com.devotion.velocity"};

    public void init() {

        init(defaultPackages);
    }

    public void init(String[] packages) {
        init(packages, filter);
    }

    public void init(String[] packages, ClassFilter filter) {
        classMap = ClassScanner.packageScan(packages, filter, Component.class);
        instanceMap = InstanceUtil.createInstance(classMap);
    }

    public Object getInstance(String className) {
        return instanceMap.get(className);
    }
}
